import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;


public class Principal  {

	final static Lock lock = new ReentrantLock();
	final static Condition puedeLeer  = lock.newCondition(); 
	final static Condition puedeEscribir = lock.newCondition(); 
	public static boolean escribiendo=false;
	public static int lectores=0;
	public static int contadorLeer=0;
	public static int contadorEscribir=0;


	public static void main( String args[] ) {

		Lector l = new Lector();
		Escritor e = new Escritor();
		l.start();
		e.start();
		l = new Lector();
		l.start();
		e = new Escritor();
		e.start();
		
		
		

	}
	public static void comenzarLeer(){

		lock.lock();
		try{
			if(Principal.escribiendo|| contadorEscribir>0){
				try {
					contadorLeer++;
					puedeLeer.await();
					lectores++;
					puedeLeer.signal();
					contadorLeer--;
				} catch (InterruptedException e) {
					System.out.println("ERROR EN COMENZAR A LEER");
				}

			}
		}finally{
			lock.unlock();
		}

	}
	public static void leer(){
		System.out.println("leer");
	}
	public static void terminaleer(){
		lock.lock();
		try{
			lectores--;
			if(lectores==0){
				puedeEscribir.signal();
				contadorEscribir--;
			}
		}finally{
			lock.unlock();
		}
	}
	public static void comenzarEscribir(){
		lock.lock();
		try{
			if(lectores!=0|| escribiendo){
				try {
					contadorEscribir++;
					puedeEscribir.await();
					escribiendo=true;
				} catch (InterruptedException e) {
					System.out.println("ERROR EN COMENZAR A ESCRIBIR");

				}
			}
		}finally{
			lock.unlock();
		}
	}
	public static void escribir(){
		System.out.println("escribir");
	}
	public static void terminaEscribir(){
		lock.lock();
		try{

			escribiendo=false;
			if(contadorLeer > 0){
				puedeLeer.signal();
				contadorLeer--;
			}else{
				puedeEscribir.signal();
				contadorEscribir--;
			}
		}finally{
			lock.unlock();
		}	
	}
}
